{
  /*
  学习目标：映射类型 - 了解
  作用：从旧类型创建新类型
*/
  type PropKeys = 'x' | 'y' | 'z';
  type Type1 = { x: string; y: string; z: string };

  type NewType = {
    // in 类似 for in 循环，表示， PropsKeys中的任意一种
    [key in PropKeys]: number;
  };

  type NewType2<T> = {
    // in 类似 for in 循环，表示， PropsKeys中的任意一种
    [key in PropKeys]: T;
  };

  const obh: NewType2<number | string> = {
    x: 123,
    y: 123,
    z: '123',
  };

  // Partial实现原理 - 映射类型
  // 1. 使用keyof, 从T中提取出键名组成的联合类型
  // 2. in 联合类型, 表示键的类型
  // 3. 统一给键名加上?，转为可选
  type Partial<T> = {
    [P in keyof T]?: T[P];
  };

  // 索引访问类型 - 访问索引类型  - 了解即可
  type Props = { a: number; b: string; c: boolean };
  type TypeA = Props['a'];
  type TypeA_B = Props['a' | 'b']; // string | number
  type TypeALLKEY = Props[keyof Props];
}
